package com.ys.p1.doubleloop;

/**
 * @author CodeYang
 * @Description 7、[难]中国古代数学家研究出了计算圆周率最简单的办法: PI=4/1-4/3+4/5-4/7+4/9-4/11+4/13-4/15+4/17......
 * *    这个算式的结果会无限接近于圆周率的值,我国古代数学家【祖冲之】计算出,圆周率在3.1415926和3.1415927之间，
 * *    请编程计算，要想得到这样的结果，他要经过多少次...
 * * 实现思路：
 * *   公式：PI=4/1-4/3+4/5-4/7+4/9-4/11+4/13-4/15+4/17......
 * *         i:  0  1   2   3   4   5    6     7   8
 * *      --> 分子：永远为4
 * *      --> 分母：2*i+1，此处i从0开始递增，每次递增+1
 * *      总结：公式中的分数，我们可以通过循环来获得，循环变量初始值为0，然后每次递增+1。在循环中，每个分数使用“4.0/(2*i+1)”来表示。
 * *   问题：需要多少个这样的分数执行累加或累减操作，那么计算出来的圆周率才在3.1415926和3.1415927之间。
 * *   需要多少个分数参与运算？？？
 * *      不知道，那么采用死循环来实现。while(true) {}
 * *   什么时候结束死循环呢？？？
 * *      当计算出来的圆周率才在3.1415926和3.1415927之间，则结束死循环。
 * *   分数什么时候累加，什么时候累减呢？？？
 * *      当循环变量i的取值为偶数的时候，则执行累加操作
 * *      当循环变量i的取值为奇数的时候，则执行累减操作
 * <p>
 * 分析各类题:
 * 发现思路分析最为重要,且要见招拆招,计算机来实现解答题目,
 * 本质是:暴力匹配
 * @Date 2020/12/8 11:29
 */
public class DoubleLoopTest05 {
    public static void main(String[] args) {
        // 1定义一个变量,用于保存计算除出的圆周率
        double Pi = 0;
        //定义一个循环变量,初始值为0,用来,计算循环的执行次数
        int i = 0;
        //不明确循环的次数时,采用死循环
        while (true) {
            // i 为偶数时,累加
            if (i % 2 == 0) {
                Pi += 4.0 / (2 * i + 1);
            }
            // i 为奇数时,累减
            else {
                Pi -= 4.0 / (2 * i + 1);
            }
            if (Pi >= 3.1415926 && Pi <= 3.1415927) {
                System.out.println(i + 1);
                break;
            }
            // 每次循环执行完毕后,每次循环变量+1
            i++;
        }

    }
}
